package com.meituan.interview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * @author ZhangyiA
 * @describe: BFS
*  题目分析：
*  骑手实际距离 ：total * 2 - maxLength  因为最后一家客户回到公司的距离不计
*  花店到所有客户地址的距离之和 , 通过 BFS 遍历累加
 * @date 2021/07/03
 */

class Point{
    int des , w ;
    public Point(int des , int w){
        this.des = des;
        this.w = w;
    }
}

public class One_FlowerDeliveryRoute {

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        HashMap<Integer , ArrayList<Point>> map = new HashMap<>();
        int total = 0;
        for(int i = 0 ; i < n  - 1; i ++){
            int src = input.nextInt();
            int des = input.nextInt();
            int wei = input.nextInt();
            total += wei; // 所有边的 和 total  , 2 * total 从花店出发来回的所有路径 , 2 * total - maxLength = 骑手实际骑行距离
            ArrayList<Point> temp = map.containsKey(src) ? map.get(src) : new ArrayList<>();
            temp.add(new Point(des , wei));
            map.put(src , temp);
        }
        Queue<Point> que = new LinkedList<>();
        que.offer(new Point(1 , 0));
        int maxLength = -1 , sumLength = 0;
        while(!que.isEmpty()){
            Point point = que.poll();
            int len = map.containsKey(point.des) ? map.get(point.des).size() : 0; // map 存储的判断时候有这个起点
            if(len == 0){ // 说明这是一条路径 , 并记录最长路径的距离
                maxLength = Math.max(maxLength , point.w);
            } else { // 依次添加后续顶点
                for(Point next : map.get(point.des)){
                    que.offer(new Point(next.des , next.w + point.w)); // 记录 花店 到 该客户的 距离 ; 是一个累加的过程
                    sumLength += next.w + point.w; // 累加求得 花店 到 所有客户的距离和
                }
            }
        }
        total = total * 2 - maxLength;
        System.out.println(sumLength + " " + total);
    }
}
/*
5
1 2 3
1 3 1
1 4 2
2 5 1
* */
